Coin-rowProblem

解题思路

首先问题的意思是,在原始位置互不相邻的条件下,所选硬币的总值最大。设第 i 个硬币币值为 Ci,可选最大金额为 F(i)。

现在我们来考虑一般情况,对于每个硬币 i 我们有两种选择:要<--or-->不要 要 i :那么可选硬币的金额 F( i ) = F( i - 2 ) + Ci ; 不要 i :那么可选硬币的金额 F( i ) = F( i - 1 ) ; 此时我们就得到了递推方程: F(n)= max{ F(n - 2)+ Ci , F(n - 1)}

现在我们考虑一下退出条件(特殊情况): 当 n = 0 时,有 F(0)= 0; 当 n = 1 时,有 F(1)= C1; 这样就构建一个递归函数解题。

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
int arr[10005];

int Max(int a, int b)                    //求最大值
{
    return a > b ? a : b;
}

void MaxValue(int n)
{
    arr[n] = Max(arr[n - 1], arr[n - 2] + arr[n]);
}

int main()
{
    memset(arr, 0, sizeof(arr));
    int n;
    scanf("%d", &n);
    for (int i = 1; i < n + 1; i++)
        scanf("%d", &arr[i]);

    for (int i = 2; i < n + 1; i++)    //从头开始找出每 i 个硬币的最大金额值
        MaxValue(i);

    printf("%d\r\n",arr[n]);

    return 0;
}

results matching ""

    No results matching ""